package br.com.sms.dao;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import br.com.sms.conexao.Conexao;
import br.com.sms.dominio.Cliente;
import br.com.sms.dominio.Perfil;
import br.com.sms.dominio.Usuario;
import br.com.sms.enuns.Situacao;

public class UsuarioDao {
	private EntityManager manager;
	private Conexao conexao;

	public UsuarioDao(){
		if(conexao == null)
			conexao = new Conexao();
	}

	public Usuario recuperarUsuario(String login){
		manager = conexao.getEntityManger();
		try{
			Query query = manager.createQuery("select u from Usuario u where u.login = :login");
			query.setParameter("login", login);
			return (Usuario)query.getSingleResult();
		}catch (NoResultException e) {
			return null;
		}
		finally{
			conexao.finalizaConexao();
		}
	}

	public Usuario recuperarUsuario(int id){
		manager = conexao.getEntityManger();
		Usuario usr = manager.find(Usuario.class, id);
		conexao.finalizaConexao();
		return usr;
	}

	public void salvarUsuario(Usuario usuario){
		manager = conexao.getEntityManger();
		manager.getTransaction().begin();
		if(usuario.getId() > 0){
			manager.merge(usuario);
		}else{
			manager.persist(usuario);
		}
		manager.getTransaction().commit();
		conexao.finalizaConexao();
	}

	public List<Usuario> recuperarUsuarios(String nome, Situacao situacao, Cliente cliente){
		String sql = montarQuery(nome, situacao, cliente);
		manager = conexao.getEntityManger();
		Query query = manager.createQuery(sql);
		preencherClausulas(query, nome, situacao, cliente);
		List<Usuario> lista = query.getResultList();
		conexao.finalizaConexao();
		return lista;
	}
	
	public List<Usuario> recuperarUsuarios(Perfil perfil){
		manager = conexao.getEntityManger();
		Query query = manager.createQuery("select u from Usuario u where u.perfil.id = :perfil");
		query.setParameter("perfil", perfil.getId());
		List<Usuario> lista = query.getResultList();
		conexao.finalizaConexao();
		return lista;
	}

	private String montarQuery(String nome, Situacao situacao, Cliente cliente){
		StringBuilder sql = new StringBuilder();
		boolean possuiWhere = false;
		sql.append("select u from Usuario u ");
		if(nome != null && nome.trim().length() > 0){
			sql.append("where u.nomeUsuario like :nome ");
			possuiWhere = true;
		}
		if(situacao != null){
			if(possuiWhere)
				sql.append("and u.situacao = :situacao ");
			else{
				sql.append("where u.situacao = :situacao ");
				possuiWhere = true;
			}
		}

		if(cliente != null){
			if(possuiWhere)
				sql.append("and u.cliente.id = :cliente");
			else
				sql.append("where u.cliente.id = :cliente");
		}
		return sql.toString();
	}

	private void preencherClausulas(Query query, String nome, Situacao situacao, Cliente cliente){

		if(nome != null && nome.trim().length() > 0){
			query.setParameter("nome", "%"+nome+"%");
		}

		if(situacao != null){
			query.setParameter("situacao", situacao);
		}
		if(cliente != null)
			query.setParameter("cliente", cliente.getId());
	}

	public void excluirUsuario(Usuario usuario){
		manager = conexao.getEntityManger();
		Usuario usr = manager.find(Usuario.class, usuario.getId());
		usr.setSituacao(Situacao.INATIVO);
		manager.getTransaction().begin();
		manager.merge(usr);
		manager.getTransaction().commit();
		conexao.finalizaConexao();
	}
}
